from day02.apps import app
import celery


@app.task
def subtraction(x, y, name):
    print(name)
    return x - y


"""【Celery+Redis】task参数详解"""

"""
name:可以显式指定任务的名字；默认是本函数的名字
bind:一个bool值，设置是否绑定一个task的实例，如果绑定，task实例会作为参数传递到任务方法中，可以访问task实例的所有的属性，即前面反序列化中那些属性
base:定义任务的基类，可以以此来定义回调函数，默认是Task类，我们也可以定义自己的Task类
default_retry_delay：设置该任务重试的延迟时间，当任务执行失败后，会自动重试，单位是秒，默认3分钟
serializer：指定本任务的序列化的方法，默认：json
"""


# @app.task(name='chengfa')
# def multiplication(x, y):
#     return x * y

# TODO 重写Task
class BasicTask(celery.Task):
    """重写Task"""

    def on_failure(self, exc, task_id, args, kwargs, einfo):
        """重写失败handler"""
        print('error handler taskID：{task_id}'.format(task_id=task_id))
        print('任务名称：', self.name)
        print('任务ID：', self.request.id)
        print('设置重试的最大次数：', self.max_retries)
        print('序列化方法的字符串：', self.serializer)

    def on_success(self, retval, task_id, args, kwargs):
        """重写成功handler"""
        print('success handler taskID：{task_id}'.format(task_id=task_id))
        print('任务名称：', self.name)
        print('任务ID：', self.request.id)
        print('设置重试的最大次数：', self.max_retries)
        print('序列化方法的字符串：', self.serializer)


# serializer='yaml'
@app.task(name='chengfa', bind=True, base=BasicTask, default_retry_delay=300, serializer='json')
def multiplication(self, x, y):
    """

    :param x:
    :param y:
    :return:
    """
    # print('任务名称：', self.name)
    # print('任务ID：', self.request.id)
    # print('设置重试的最大次数：', self.max_retries)
    # print('序列化方法的字符串：', self.serializer)
    return x * y
